import java.util.Arrays;

/**
 * @User: vitobo
 * @Date: 2024-04-23
 * @Description: 数组: 是一块连续的存储空间, 存储的是相同数据类型的元素
 */


public class Array {

    // 对于数组作为参数传递
    public static void func1(int[] tmp1){
        tmp1 = new int[10];
    }

    public static void func2(int[] tmp2){
        tmp2[0] = 99;
    }

    public static void main12(String[] args) {
        int[] array1 = {1,2,3,4};
        func1(array1);
        System.out.println(Arrays.toString(array1));

        int[] array2 = {11,22,33,44};
        func2(array2);
        System.out.println(Arrays.toString(array2));

    }

    public static void main11(String[] args) {
        int[] array = {1,2,3,4};

        // 1. 数组对象是在堆上的
        // 2. 引用变量目前是在main函数里面的,它属于局部变量, 当函数结束就会被回收内存
        // 3. 对象的回收, 是没人引用它
    }


    // 数组传参
    public static void swap(int[] array){
        int tmp = array[0];
        array[0] = array[1];
        array[1] = tmp;
    }

    public static void main10(String[] args) {
        int[] tmp = {1,2};
        System.out.println("交换前: " + Arrays.toString(tmp));
        swap(tmp);
        System.out.println("交换后: " + Arrays.toString(tmp));
    }



    // 数组作为函数的返回值
    public static int[] f3(){
        int[] tmp = {1,2,3,4,5,6,7,8};
        return tmp;
    }

    public static void main9(String[] args) {
        int[] array = {1,2,3};
        int[] ret = f3();
        System.out.println(Arrays.toString(ret));
    }


    // 修改形参自己的指向
    public static void f1(int[] arr) {
        arr = new int[10];
    }

    // 修改引用所指向的内容
    public static void f2(int[] arr){
        arr[0] = 99;
    }

    // 数组的应用
    public static void main8(String[] args) {
        int[] array = {1,2,3,4};
        f1(array);          // 0 0 0 0 0 0 0 0 0 0
        //f2(array);        // 99 2 3 4
        System.out.println(Arrays.toString(array));
    }



    public static void main7(String[] args) {
        // 局部变量使用的时候, 必须初始化
        int[] arr1 = null;   //代表这个引用不指向任何的对象, 因此不能对这个内存进行任何读写操作
        System.out.println(arr1);
    }

    public static void main6(String[] args) {
        // * 一个引用 不能同时指向多个对象   一个变量只能存储一个值
        int[] arr1 = {1,2,3,4};
        int[] arr2 = {5,6,7,8};
        arr1 = arr2;  // arr1指向了arr2指向的对象, 此时 arr1没有引用了, 就被JVM自动回收了
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
    }

    public static void main5(String[] args) {
        int[] arr1 = {1,2,3,4};
        System.out.println(Arrays.toString(arr1));

        int[] arr2 = arr1;   // arr2这个引用 指向了 arr1这个引用 所引用的对象
        arr2[1] = 99;
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));

    }


    public static void main4(String[] args) {
        // 数组是一种引用数据类型

        // 内存: 一块连续的空间    局部变量, 放在虚拟机栈上;
        int a = 10;  // 虚拟机栈上, 变量a 10
        int b = 20;  // 虚拟机栈上, 变量b 20
        // array就称为 引用变量, 存放着对象的地址(地址经过哈希得到的)
        int[] array = {1,2,3,4};  // // 虚拟机栈上, 变量Array  {1,2,3,4}数组的对象存放在堆上
        System.out.println(array);

    }

    public static void main3(String[] args) {
        int[] arr1 = {1,2,3};
        System.out.println(arr1[1]);

        arr1[1] = 99;
        System.out.println(arr1[1]);

        // 数组遍历
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i] + " ");
        }
        System.out.println();

        // 数组当中数据的类型定义的变量 : 数组名    for each 增强for循环  拿不到数组下标
        for (int x: arr1) {
            System.out.print(x + " ");
        }
        System.out.println();

        // Java当中的工具, Arrays专门用来操作数组
        // 返回,把数组转变为字符串, 然后返回
        String ret = Arrays.toString(arr1);
        System.out.println(ret);

    }

    public static void main2(String[] args) {
        int[] arr1 = {1,2,3}; //直接赋值 静态初始化
        int[] arr2 = new int[]{1,2,3,4};  //动态初始化

        int[] arr3 = new int[10];  //只是分配了内存,但是没有进行赋值, 只有默认值0

        boolean[] flg = new boolean[10]; // 默认值为false

        // 在Java当中, 如果定义了一个数组, 分配了内存大小. 但是没有进行初始化, 那么会有一个默认值


    }

    public static void main1(String[] args) {

        // 通过数组来组织数据
        // 数组下标的范围: 0- len(array)-1
        int[] arr1 = {1,2,3};
        float[] arr2 = {1.0f, 2.5f};

        System.out.println(arr1[0]);
        int len = arr1.length;
        System.out.println(len);


    }
}
